單一職責、開放封閉原則簡介


Posted by Andy Tsai on 2021-07-27

單一職責原則 Single Responsibility Principle(SRP)

編寫程式時,我們要檢視它們的責任,讓每個方法只做好一件事(單一責任),如果功能複雜就拆分開,每個部分保持獨立。這關係到能不能建立易於重用、維護、測試的程式。

當一個方法有過多的職責,那麼需要修改到它的機率就越大,在修改時也是件危險的事,因為過多的職責耦合在一起時,一個職責的變化有可能影響到其他職責,容易發生意外的bug。

  • 拆職責的時機
    也不是所有時候都要拆職責,可以去思考,這個方法發生變化的可能性多高,如果很低,那麼也許寫在一起也無妨,未來有需要 重構時再改也ok。

開放封閉原則 Open-Closed Principle (OCP)

  • 對擴展保持開放,對修改封閉
    在增加需求時,應該增加代碼,而非修改已有代碼,修改已有代碼是件危險的事,尤其業務邏輯複雜時,一個不小心就會發生連鎖反應,bug越改越多。

  • 將不可變和可變隔離開
    將程式中容易發生變化的地方,構造抽象來封裝它們,
    也就是把穩定不變的部分和容易變化的部分隔離開來,在未來系統演進過程,我們不太需要去動不變的部分,只需要處理變化的部分即可。

從簡單的Promise範例體會SRP和OCP

function imgLoad(url) {
    return new Promise(function(resolve, reject) {
        var img = document.createElement('img')
        img.onload = () => resolve(img);
        img.onerror = () => reject('加載失敗')
        img.src = url
    });
}

imgLoad('https://xxxxx').then((img) => {
    console.log(img.width)
    return img
}).then((img) => {
    console.log(img.height)
    return img
}).catch((err) => {
    console.log(err)
})

在這裡,每個.then只做一件事,這就是單一職責原則

現在假設有一個新需求,要打印出圖片連結,我們就再加再加一個.then即可

imgLoad('https://xxxxx').then((img) => {
    console.log(img.width)
    return img
}).then((img) => {
    console.log(img.height)
    return img
}).then((img) => {
    console.log(img.src)
}).catch((err) => {
    console.log(err)
})

這就是開放封閉原則,對擴展開放,對修改封閉

總結

SRP和OCP都是非常好的設計理念,能讓我們在維護、擴展應用時舒服許多,
但也要注意不需一成不變的遵守,有時over design 反而會增加了不必要的複雜性 造成維護成本提高。










Related Posts

The introduction and difference between class component and function component in React

The introduction and difference between class component and function component in React

The way open PDF in android.

The way open PDF in android.

爬蟲閱讀紀錄

爬蟲閱讀紀錄


Comments